package com.xinwei.leetcode.链表;

/**
 * https://leetcode-cn.com/problems/reverse-linked-list/
 * 总结:做链表的算法题，最重要的就是画图，思考如何从原本的线转变成要求的线
 */
public class _206_反转链表 {

    // 递归方法
    // 思考：拆分开来想，从最里层开始想。
    // 倘若链表是2、1，那么传入2 ，应使newHead变为1 ，应使1.next = 2，应使2.next = null
    public ListNode reverseList(ListNode head) {
        if (head == null || head.next == null) return head;
        ListNode newHead = reverseList(head.next);
        head.next.next = head;
        head.next = null;
        return newHead;
    }

    // 迭代方法
    // 像这些head、head.next、newHead用在左边等号时就是地址，用在等号右边时是节点，调用属性时也是节点，例如head.next这里的head使节点
    public ListNode reverseList1(ListNode head) {
        ListNode newHead = null;
        while (head != null) {
            ListNode tmp = head.next;
            head.next = newHead;
            newHead = head;
            head = tmp;
        }
        return newHead;
    }

}
